SQL Server-এ Stored Procedure এবং Function দুটি গুরুত্বপূর্ণ প্রোগ্রামিং কন্সট্রাক্ট, যা ডেটাবেসে বিভিন্ন কাজ করার জন্য ব্যবহার করা হয়। এগুলোর মাধ্যমে আমরা ডেটাবেসের মধ্যে লজিক এবং প্রক্রিয়া কভার করতে পারি। তবে যখন আমরা কোনও Stored Procedure বা Function তৈরি করি, তখন আমাদের Error Handling নিশ্চিত করা গুরুত্বপূর্ণ, যাতে কোনো ত্রুটি (Error) ঘটলে প্রোগ্রাম সঠিকভাবে কাজ করতে পারে এবং ব্যবহারকারীকে সঠিক বার্তা দেওয়া যায়।
1. Stored Procedure এ Error Handling
Stored Procedure-এর মধ্যে Error Handling করতে SQL Server আমাদের TRY...CATCH ব্লক প্রদান করেছে। এই ব্লকটি ব্যবহার করে আমরা SQL কোডে ত্রুটি মোকাবিলা করতে পারি এবং ত্রুটির বিস্তারিত তথ্য পেতে পারি।
1.1. TRY...CATCH ব্লক
TRY ব্লকে SQL কোড রাখা হয় যা সাধারণত সফলভাবে সম্পাদিত হওয়ার কথা, এবং যদি এখানে কোনো ত্রুটি ঘটে, তাহলে CATCH ব্লকটি সেই ত্রুটির সাথে মোকাবিলা করবে।
CREATE PROCEDURE ExampleProcedure
AS
BEGIN
BEGIN TRY
-- একটি ভুল SQL স্টেটমেন্ট চালানোর চেষ্টা
SELECT 1 / 0; -- ডিভিশন বাই জিরো, এটি একটি ত্রুটি হবে
END TRY
BEGIN CATCH
-- ত্রুটির বিবরণ নিন
SELECT ERROR_MESSAGE() AS ErrorMessage;
SELECT ERROR_NUMBER() AS ErrorNumber;
SELECT ERROR_LINE() AS ErrorLine;
END CATCH
END;
এই উদাহরণে, যদি 1 / 0 কোডে ডিভিশন বাই জিরো ত্রুটি ঘটে, তাহলে CATCH ব্লক চালু হবে এবং ত্রুটির বার্তা, সংখ্যা এবং লাইনের তথ্য প্রদান করবে।
1.2. CATCH ব্লকে ব্যবহার করা কিছু গুরুত্বপূর্ণ ফাংশন
- ERROR_MESSAGE(): ত্রুটির সম্পূর্ণ বার্তা প্রদান করে।
- ERROR_NUMBER(): ত্রুটির কোড প্রদান করে।
- ERROR_LINE(): ত্রুটি কোথায় ঘটেছে তা সুনির্দিষ্ট লাইনের নম্বর প্রদান করে।
- ERROR_SEVERITY(): ত্রুটির গুরুতরতা স্তর (severity) প্রদান করে।
- ERROR_STATE(): ত্রুটির অবস্থান (state) প্রদান করে।
1.3. Transaction সহ Error Handling
যখন আপনি টেবিলের সাথে transaction ব্যবহার করছেন, তখন ত্রুটি ঘটলে পুরো transaction রোলব্যাক (rollback) করা উচিত। উদাহরণস্বরূপ:
CREATE PROCEDURE ExampleTransactionProcedure
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
-- কিছু SQL অপারেশন
INSERT INTO Orders (OrderID, CustomerID, Amount)
VALUES (1, 101, 1000);
-- ডিভিশন বাই জিরো ত্রুটি
SELECT 1 / 0;
COMMIT TRANSACTION; -- যদি কোন ত্রুটি না ঘটে, তাহলে ট্রানজেকশন কমিট হবে
END TRY
BEGIN CATCH
-- ত্রুটি ঘটলে ট্রানজেকশন রোলব্যাক করুন
ROLLBACK TRANSACTION;
-- ত্রুটির বিবরণ নিন
SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH
END;
এই উদাহরণে, INSERT স্টেটমেন্ট সফল হলে COMMIT হবে, কিন্তু যদি কোনো ত্রুটি ঘটে, তাহলে ROLLBACK হবে এবং ডেটাবেসের অবস্থার কোনো পরিবর্তন হবে না।
2. Function এ Error Handling
SQL Server-এ Function এ Error Handling করা Stored Procedure এর তুলনায় কিছুটা সীমিত, কারণ Functions সাধারণত ট্রানজেকশন এবং CATCH ব্লক ব্যবহার করতে পারে না। তবে, কিছু workaround ব্যবহার করে ত্রুটি মোকাবিলা করা সম্ভব।
2.1. TRY...CATCH ব্লক ব্যবহার করা
TRY...CATCH ব্লক Function এর মধ্যে কাজ করবে না, কারণ Functions এ টানজেকশন সাপোর্ট থাকে না। কিন্তু কিছু বিশেষ ক্ষেত্রে (যেমন, Scalar Function বা Inline Table-Valued Functions) ত্রুটি পরিচালনা করা যেতে পারে।
CREATE FUNCTION ExampleFunction (@num INT)
RETURNS INT
AS
BEGIN
DECLARE @result INT;
BEGIN TRY
-- ডিভিশন বাই জিরো ত্রুটি
SET @result = 1 / @num;
END TRY
BEGIN CATCH
-- ত্রুটির বিবরণ
SET @result = NULL; -- যদি ত্রুটি ঘটে, তবে NULL ফেরত দিন
END CATCH
RETURN @result;
END;
এই ফাংশনে, 1 / @num যদি শূন্যে ভাগ করার চেষ্টা হয়, তবে CATCH ব্লকটি সেট করা হবে এবং ফাংশন NULL ফেরত দেবে।
2.2. T-SQL Error Handling in Scalar Functions
ফাংশনগুলো সাধারণত ত্রুটি থ্রো (throw) করতে পারে না, তবে আপনি NULL ফেরত দিয়ে ত্রুটি হ্যান্ডল করতে পারেন:
CREATE FUNCTION SafeDivide (@num INT, @denom INT)
RETURNS INT
AS
BEGIN
IF @denom = 0
RETURN NULL; -- শূন্য দিয়ে ভাগ করা যাবে না
ELSE
RETURN @num / @denom;
END;
এই ফাংশনে, যদি ডিভাইডারের মান 0 হয়, তবে এটি NULL ফেরত দিবে, যা ত্রুটির সূচক হিসেবে কাজ করে।
3. Summary
- Stored Procedures-এ TRY...CATCH ব্লক ব্যবহার করে আপনি কার্যকরীভাবে ত্রুটি হ্যান্ডলিং করতে পারেন এবং তা লগ করতে পারেন। Transactions এর মাধ্যমে আপনি ডেটাবেসের অবস্থা সুরক্ষিত রাখতে পারেন।
- Functions সাধারণত TRY...CATCH ব্লক বা ট্রানজেকশন ব্যবহার করতে পারে না, কিন্তু কিছু কাস্টম লজিক ব্যবহার করে আপনি ত্রুটি সমাধান করতে পারেন, যেমন NULL ফেরত দেয়া বা প্রিসেট কন্ডিশন চেক করা।
এভাবে, SQL Server-এ Error Handling নিশ্চিত করা হলে ডেটাবেস অ্যাপ্লিকেশনটি আরও স্থিতিশীল এবং নিরাপদ হয়ে উঠে।
Read more